在使用 RxJava 前首先要先理解它的運作原理就是,增開另一個線程使你不會因資料量的問題而卡在一個頁面不能做其他的事情
在解釋線程前須先了解異步與同步的差異。
異步:當要處理復數以上的事件時可以同時執行
同步:一定要處理完當前的事件才會繼續
RxJava 你可以把它想像成一個遊樂園的入口,資料是遊客,售票地是被觀察著,而入口處是觀察著,當今天賣出一張票時被觀察著就會說有一個客人買票了即為 onNext ,所以onNext就可以有無限多個,可是當今天售票處發現遊樂園人數滿了就跟入口處說不能再讓人進去了即為 onComplete,所以當今天就算售票處在賣票給別人時,入口處也不會再讓任何人進去了。
第一步:添加需要使用的套件到build.dradle
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
第二步:創建一個遊樂園的入口處,即為觀察著
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String customer) {
Log.d("TAG", "第: " + customer + "位客人");
}
@Override
public void onError(Throwable e) {
Log.d("TAG", e.getMessage());
}
@Override
public void onComplete() {
Log.d("TAG", "full");
}
};
第三步:創建售票處,即為被觀察著
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
// 使用 ObservableEmitter 來發送訊息
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
emitter.onNext("4");
emitter.onNext("5");
}
});
第四步:將入口處與售票處做一個傳遞訊號的通道
observable.subscribe(observer);
以下即為所有程式碼合併的樣子 ▼▼▼
package com.example.retrofit;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.d("TAG", "Item: " + s);
}
@Override
public void onError(Throwable e) {
Log.d("TAG", e.getMessage());
}
@Override
public void onComplete() {
Log.d("TAG", "finish");
}
};
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
// 使用 ObservableEmitter 來發送訊息
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
emitter.onNext("4");
emitter.onNext("5");
}
});
observable.subscribe(observer);
}
}